package com.example;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.unit.DataSize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;


/**
 * @author wuyinggang
 * @Description: todo
 * @date 2021/7/2016:12
 * 文件上传Controller同时包含文件转移
 */
@Controller
@RequestMapping("/api")
public class FilesUploadController {


    @Autowired
    private FilesConfig filesConfig;

    //设置文件上传大小：在配置文件中限定
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
         //单个文件最大
        factory.setMaxFileSize(DataSize.ofMegabytes(Integer.valueOf(filesConfig.getMaxFileSize()))); //MB
        //factory.setMaxFileSize(DataSize.ofKilobytes(80)); //KB
        //factory.setMaxFileSize(DataSize.ofGigabytes(80)); //Gb
        //设置总上传数据总大小
        factory.setMaxRequestSize(DataSize.ofGigabytes(Integer.valueOf(filesConfig.getMaxRequestSize()))); //MB
        return factory.createMultipartConfig();
        }


    @GetMapping("/one")
    public String uploladPage(){
        return "upload";
    }

    //----------------------------------------单文件上传------------------------------------
    /**
    　　* @param ${tags}
    　　* @return ${return_type}
    　　* @throws
    　　* @author wuyinggang
    　　* @date 2021/7/20 17:21
    　　*/
    @PostMapping("/uploadOne")
    public String uploadOne(@RequestParam("file") MultipartFile file, Model model) throws IOException, ServletException {
        if (file.isEmpty()) {
            return "upload";
        }
        //判断上传文件的大小是否超出范围,这里会服务器报错，并跳转到error页面，但是我下面返回index就没成功。
        boolean m = FileUtil.checkFileSize(file, Integer.parseInt(filesConfig.getMaxFileSize()), "M");
        if (!m){
//            throw new ServletException("文件太大，请重新上传。。。。");
            return "index";
        }
        //之所以到了临时目录是因为传递的就是临时目录地址
        String path = FilesUploadService.uploadOne(file, filesConfig.getTemporaryPath());

        model.addAttribute("fileName",file.getOriginalFilename());
        //F:/es/upload/temporary/2021/07/21/e9a6fc9dfcb844c6a643bb8d947ab856.sql
        model.addAttribute("path",path);
        return "ok";
        }


    @GetMapping("/more")
    public String uploladPageT(){
        return "uploadmore";
    }

    /**
    　　* @param ${tags}
    　　* @return ${return_type}
    　　* @throws                 多文件上传。。。。。。。。。。。。。。。。。。。。。。。
    　　* @author wuyinggang
    　　* @date 2021/7/21 14:30
    　　*/
    @PostMapping("/uploadMore")
     public String uploadMore(@RequestParam("file")MultipartFile[] files, Model model, RedirectAttributes redirectAttributes) throws IOException {
        //判断总共的文件内存，是否超出上传范围,我没写
        int couny=3;
        List<String> listFileName = new ArrayList<>();
        for (MultipartFile f : files) {
            if(f.isEmpty()){
                couny--;
            }else {
                listFileName.add(f.getOriginalFilename());
            }
        }
        if (couny==0){
            System.out.println("满3返回重填。。。。");
            return "uploadmore";
        }
        String uploadMorePath = FilesUploadService.uploadMoreFile(files, filesConfig.getTemporaryPath());
        List<String> uploadMores = Arrays.asList(uploadMorePath.split(","));
        model.addAttribute("fileName",listFileName);
        //path为一个数组,遍历如下
        //存储路径为 :F:/es/upload/temporary/2021/07/21/1a9e224163a24f71b9d11e6a88653c1c.sql
        //存储路径为 :F:/es/upload/temporary/2021/07/21/c42da48363b8437c81c8050c6a15a032.sql
        model.addAttribute("path",uploadMores);
        return "ok";
        }



    @GetMapping("/zhuan")
    public String uploladPageZ(){
        return "zhuanyi";
    }
/**
　　* @param ${tags} 
　　* @return ${return_type} 
　　* @throws----------------------------单个文件转移-,注意页面参数问题-：@RequestParam("zhuanyi") String u---------------------
　　* @author wuyinggang------------这个是用页面form表单进行传递的，直接输入字符串即可，非JSON形式
　　* @date 2021/7/21 15:02
　　*/
//    @PostMapping("/change")
//    //说明：
//    //当我们转移一个文件名称时可以用下面这个方法
//    public String filesChange(@RequestParam("zhuanyi") String u) throws IOException {
//        //拿到临时目录的文件,
//        //U的形式这里为2021/07/21/1a9e224163a24f71b9d11e6a88653c1c.sql，
//        //但是我在前面上传部门改了，变为了全路径
//        //所以可以直接根据U获取临时目录文件
//        String path = filesConfig.getTemporaryPath() + u;
//        File file = new File(path);
//        //File类型转换为MultipartFile类型
//        MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
//        //正式目录名与文件名生成一个新的路径
//        String newPath = filesConfig.getFormalPath() + u;
//        File newFile = new File(newPath);
//        //判断文件目录是否存在
//        if (!newFile.getParentFile().exists()) {
//            //创建文件存放目录
//            //无论是几个/，都是创建一个文件夹
//            //mkdirs(): 创建多层目录，如：E:/upload/2019
//            //mkdir(): 只创建一层目录，如：E:upload
//            //如果不加这一行不会创建新的文件夹，会报系统找不到路径
//            newFile.getParentFile().mkdirs();
//        }
//        //存储文件
//        multipartFile.transferTo(newFile);
//        //去掉目录名，保留文件总体路径，通过该路径访问图片
//        return "zhuanyiok";
//        }



/**
　　* @param ${tags}
　　* @return ${return_type}
　　* @throws---------------------------------------多个文件转移-此时页面那个不能用，用POSTMAN工具传JSON----------------------------
　　* @author wuyinggang
　　* @date 2021/7/21 15:05
　　*/
    @PostMapping("/change")
    //说明：
    //当我们转移一个文件名称时可以用下面这个方法,postman中参数为
//["2021/07/21/1a9e224163a24f71b9d11e6a88653c1c.sql","2021/07/21/c42da48363b8437c81c8050c6a15a032.sql"]

    public String filesChange(@RequestBody String[] uploadPath) throws IOException {
        if (uploadPath.length==0){
            return "zhuan";
        }
//        循环遍历传来的String数组
        for (String u : uploadPath) {
        //拿到临时目录的文件,
        //U的形式这里为2021/07/21/1a9e224163a24f71b9d11e6a88653c1c.sql，
        //但是我在前面上传部门改了，变为了全路径
        //所以可以直接根据U获取临时目录文件
        String path = filesConfig.getTemporaryPath() + u;
        File file = new File(path);
        //File类型转换为MultipartFile类型
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
        //正式目录名与文件名生成一个新的路径
        String newPath = filesConfig.getFormalPath() + u;
        File newFile = new File(newPath);
        //判断文件目录是否存在
        if (!newFile.getParentFile().exists()) {
            //创建文件存放目录
            //无论是几个/，都是创建一个文件夹
            //mkdirs(): 创建多层目录，如：E:/upload/2019
            //mkdir(): 只创建一层目录，如：E:upload
            //如果不加这一行不会创建新的文件夹，会报系统找不到路径
            newFile.getParentFile().mkdirs();
        }
        //存储文件
        multipartFile.transferTo(newFile);
        //去掉目录名，保留文件总体路径，通过该路径访问图片
            }
        return "zhuanyiok";
    }
}
